package dd;

/**
 * Creared with IntelliJ IDEA.
 * Description:
 * User:yxd
 * Date:2021-12-31
 * Time:20:43
 */
//泛型 是编译期的一种机制 擦除机制 运行时会被擦除   泛型尖括号当中的内容不参与类型的组成  运行时<E>会被替换为Object
class MyArrayList<E> {//泛型  可以指定  顺序表类型 E是一个占位符
    private E[] elem;
    private int usedSize;
    public MyArrayList(){
        this.elem = (E[]) new Object[10];//这样其实也是不准确的 也不能直接写为Object类型的
        //直接写成E的也会出错  底层JVM里面不允许
        // 就和前面的一样报错直接写成Object 后面接收的时候会出错（数组之间的转换不能整体强转  里面的内容是没有转的）
        // 最正确的应该使用反射来写
    }
    public void add(E val){
        this.elem[usedSize] = val;
        usedSize++;
    }
    public E get(int pos){
        return this.elem[pos];
    }
}
public class Fan {
    public static void main(String[] args) {
        //MyArrayList myArrayList = new MyArrayList(); 此时局限性太大  只能放int类型的
        //myArrayList.add(1);
        //使用泛型后可以自己指定类型  可以把类型作为参数 来传递
        MyArrayList<String> myArrayList = new MyArrayList<>();
        myArrayList.add("jadsj");//编译时会自己检查对类型是否匹配  如果不匹配  会报错
        myArrayList.add("hhh");
        String str = myArrayList.get(1);//获取一位置的元素
        System.out.println(str);
        MyArrayList<Integer> myArrayList1 = new MyArrayList<>();
        myArrayList1.add(1);
        int a = myArrayList1.get(0);
        System.out.println(a);
        MyArrayList<Boolean> myArrayList2 = new MyArrayList<>();
    }
}
